const fp = require("lodash/fp")

class Container {
    static of(value){
        return new Container(value)
    }
    constructor(value){
        this._value = value
    }
    map (fn) {
        return Container.of(fn(this._value))
    }
}

class Maybe {
    static of(x){
        return new Maybe(x)
    }
    isNothing(){
        return this._value === null || this._value === undefined
    }
    constructor(x){
        this._value = x
    }
    map (fn) {
        return this.isNothing() ? this : Maybe.of(fn(this._value))
    }
}

// 练习1
let maybe = Maybe.of([5,6,1])
let ex1 = () => {
    return maybe.map(fp.map(fp.add(1)))
}
console.log(ex1())

// 练习2
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => {
    return xs.map(fp.first)
}
console.log(ex2())

// 练习3
let saftProp = fp.curry((x,o)=> {
    return Maybe.of(o[x])
})
let user = { id:2, name: 'Albert' }
let ex3 = ()=>{
    return saftProp('name', user).map(fp.first)
}
console.log(ex3())

// 练习4
let ex4 = (n) => {
    return Maybe.of(n).map(parseInt)
}
console.log(ex4('121fdsf'))